function Point(x, y) {
	//private
	var _this_ = this;
	//parameter
	if (typeof x == "undefined") x = 0;
	if (typeof y == "undefined") y = 0;
	/**
	 * 点的x坐标值
	 */
	this.x = x;
	/**
	 * 点的y坐标值
	 */
	this.y = y;
	//function
	if (typeof Point._initialize_ == "undefined") {
		/**
		 * 获取该点的一个克隆对象
		 */
		Point.prototype.clone = function () {
			return new Point(x, y);
		};
		/**
		 * 以指定位移偏移该点
		 * @param x 横向位移值
		 * @param x 纵向位移值
		 */
		Point.prototype.offset = function (x, y) {
			_this_.x += x;
			_this_.y += y;
		};
		/**
		 * 对象初始化标识，使用function属性只初始化一次，并只有唯一一份
		 */
		Point._initialized_ = true;
	}
}
/**
 * 一个正向(宽和高都大于或者等于0)矩形
 * @param x 矩形左上角x坐标
 * @param y 矩形左上角y坐标
 * @param width 矩形宽度
 * @param height 矩形高度
 * @returns {Rectangle}
 */
function Rectangle(x, y, width, height) {
	//private
	var _this_ = this;
	//parameter
	if (typeof x == "undefined") x = 0;
	if (typeof y == "undefined") y = 0;
	if (typeof width == "undefined") width = 0;
	if (typeof height == "undefined") height = 0;
	/**
	 * 矩形左上角x坐标
	 */
	this.x = x;
	/**
	 * 矩形左上角y坐标
	 */
	this.y = y;
	/**
	 * 矩形宽度
	 */
	this.width = width;
	/**
	 * 矩形高度
	 */
	this.height = height;
	//function
	if (typeof Rectangle._initialize_ == "undefined") {
		/**
		 * 获取矩形的逻辑右边x坐标
		 */
		Rectangle.prototype.right = function() {return _this_.x + _this_.width;};
		/**
		 * 获取矩形的逻辑下边y坐标
		 */
		Rectangle.prototype.bottom = function() {return _this_.y + _this_.height;};
		/**
		 * 获取矩形的逻辑左上顶点对象:Point
		 */
		Rectangle.prototype.topLeft = function() {return new Point(_this_.x, _this_.y);};
		/**
		 * 获取矩形的逻辑右上顶点对象:Point
		 */
		Rectangle.prototype.topRight = function() {return new Point(_this_.x + _this_.width, _this_.y);};
		/**
		 * 获取矩形的逻辑左下顶点对象:Point
		 */
		Rectangle.prototype.bottomLeft = function() {return new Point(_this_.x, _this_.y + _this_.height);};
		/**
		 * 获取矩形的逻辑右下顶点对象:Point
		 */
		Rectangle.prototype.bottomRight = function() {return new Point(_this_.x + _this_.width, _this_.y + _this_.height);};
		/**
		 * 获取矩形的逻辑中心点对象:Point
		 */
		Rectangle.prototype.center = function() {return new Point(_this_.x + _this_.width / 2, _this_.y + _this_.height / 2);};
		/**
		 * 判断矩形是否为正向(正向：width大于等于0，并且height大于等于0)
		 */
		Rectangle.prototype.isPositive = function() {return (_this_.width >= 0 || _this_.height >= 0);};
		/**
		 * 调整矩形为正向(正向：width大于等于0，并且height大于等于0)
		 */
		Rectangle.prototype.positive = function () {
			if (_this_.width < 0) {
				_this_.x = _this_.right();
				_this_.width = -_this_.width;
			}
			if (_this_.height < 0) {
				_this_.y = _this_.bottom();
				_this_.height = -_this_.height;
			}
		};
		/**
		 * 获取该矩形的一个克隆对象
		 */
		Rectangle.prototype.clone = function () {
			return new Rectangle(_this.x, _this_.y, _this_.width, _this_.height);
		};
		/**
		 * 判断该矩形是否包含某个点
		 * @param x 目标点x坐标
		 * @param y 目标点y坐标
		 */
		Rectangle.prototype.contains = function (x, y) {
			var point = new Point(x, y);
			return _this_.x <= point.x && _this_.right >= point.x && _this_.y <= point.y && _this_.bottom >= point.y;
		};
		/**
		 * 获取该矩形与目标矩形的并集矩形，不改变当前和目标矩形
		 * @param rectangle 目标矩形
		 */
		Rectangle.prototype.union = function (rectangle) {
			var ra1 = _this_.clone();
			if (!ra1.isPositive()) ra1.positive();
			var ra2 = rectangle.clone();
			if (!ra2.isPositive()) ra2.positive();
			var x = Math.min(ra1.x, ra2.x);
			var y = Math.min(ra1.y, ra2.y);
			return new Rectangle(x, y, Math.max(ra1.right(), ra2.right()) - x, Math.max(ra1.bottom(), ra2.bottom()) - y);
		};
		/**
		 * 获取该矩形与目标矩形的交集矩形，不改变当前和目标矩形
		 * @param rectangle 目标矩形
		 */
		Rectangle.prototype.intersect = function (rectangle) {
			var ra1 = _this_.clone();
			if (!ra1.isPositive()) ra1.positive();
			var ra2 = rectangle.clone();
			if (!ra2.isPositive()) ra2.positive();
			var x = Math.max(ra1.x, ra2.x);
			var y = Math.max(ra1.y, ra2.y);
			var width = Math.min(ra1.right(), ra2.right()) - x;
			var height = Math.min(ra1.bottom(), ra2.bottom()) - y;
			if (width < 0 || height < 0)
				x = y = width = height = 0;
			return new Rectangle(x, y, width, height);
		};
		/**
		 * 矩形中心点位置不变，使矩形向横向延伸2*x个单位,纵向延伸2*y个单位
		 * @param x 在水平方向上延伸的宽度的一半
		 * @param y 在垂直方向上延伸的高度的一半
		 */
		Rectangle.prototype.inflate = function (x, y) {
			_this_.x -= x;
			_this_.width += 2 * x;
			_this_.height -= y;
			_this_.height += 2 * y;
		};
		/**
		 * 对象初始化标识，使用function属性只初始化一次，并只有唯一一份
		 */
		Rectangle._initialized_ = true;
	}
	//默认将该矩形调整为正向
	this.positive();
}